package com.ruoyi.system.service.impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.HaDrugPcodelistMapper;
import com.ruoyi.system.domain.HaDrugPcodelist;
import com.ruoyi.system.service.IHaDrugPcodelistService;
//引入@鲍

import org.springframework.transaction.annotation.Transactional;
import java.util.Date;                 // ① Date 本体
import com.ruoyi.common.utils.DateUtils;
import java.time.LocalDate;

/**
 * 采购单自动编码Service业务层处理
 * 
 * @author 鲍小伟
 * @date 2025-11-28
 */
@Service
public class HaDrugPcodelistServiceImpl implements IHaDrugPcodelistService 
{
    @Autowired
    private HaDrugPcodelistMapper haDrugPcodelistMapper;

    /**
     * 查询采购单自动编码
     * 
     * @param seqid 采购单自动编码主键
     * @return 采购单自动编码
     */
    @Override
    public HaDrugPcodelist selectHaDrugPcodelistBySeqid(Long seqid)
    {
        return haDrugPcodelistMapper.selectHaDrugPcodelistBySeqid(seqid);
    }

    /**
     * 查询采购单自动编码列表
     * 
     * @param haDrugPcodelist 采购单自动编码
     * @return 采购单自动编码
     */
    @Override
    public List<HaDrugPcodelist> selectHaDrugPcodelistList(HaDrugPcodelist haDrugPcodelist)
    {
        return haDrugPcodelistMapper.selectHaDrugPcodelistList(haDrugPcodelist);
    }

    /**
     * 新增采购单自动编码
     * 
     * @param haDrugPcodelist 采购单自动编码
     * @return 结果
     */
    @Override
    public int insertHaDrugPcodelist(HaDrugPcodelist haDrugPcodelist)
    {
        return haDrugPcodelistMapper.insertHaDrugPcodelist(haDrugPcodelist);
    }

    /**
     * 修改采购单自动编码
     * 
     * @param haDrugPcodelist 采购单自动编码
     * @return 结果
     */
    @Override
    public int updateHaDrugPcodelist(HaDrugPcodelist haDrugPcodelist)
    {
        return haDrugPcodelistMapper.updateHaDrugPcodelist(haDrugPcodelist);
    }

    /**
     * 批量删除采购单自动编码
     * 
     * @param seqids 需要删除的采购单自动编码主键
     * @return 结果
     */
    @Override
    public int deleteHaDrugPcodelistBySeqids(Long[] seqids)
    {
        return haDrugPcodelistMapper.deleteHaDrugPcodelistBySeqids(seqids);
    }

    /**
     * 删除采购单自动编码信息
     * 
     * @param seqid 采购单自动编码主键
     * @return 结果
     */
    @Override
    public int deleteHaDrugPcodelistBySeqid(Long seqid)
    {
        return haDrugPcodelistMapper.deleteHaDrugPcodelistBySeqid(seqid);
    }

    /**
     * nextPurchaseNo在这里写实现的方法
     * 新增：自动生成采购单号
     * 鲍小伟20251128
     */
    @Override
    @Transactional          // 必须事务，保证行锁
    public String nextPurchaseNo() {
        java.time.LocalDate today = java.time.LocalDate.now();
        // ===== ① 保证当天行存在（事务内） =====
        haDrugPcodelistMapper.insertIfNotExists(today);
        // 1. 原子+1（带行锁）
        haDrugPcodelistMapper.increaseCurNum(today);
        // 2. 再查询当前值（仍处于锁内，防止幻读）
        HaDrugPcodelist po = haDrugPcodelistMapper.selectForUpdate(today);
        // 3. 拼接单号
        return po.buildNo();                       // P20250625-001
    }

    /**
     * 查询最小号的接口
     * 鲍小伟@20251201
     */

    @Override
    @Transactional
    public String nextMinPurchaseNo() {   //
       // Date today = new Date();  //时间的格式都不对，
        java.time.LocalDate today = java.time.LocalDate.now(); //需要将日期的格式换为这个
        System.out.println(today);
        // 1. 查最小空号
        HaDrugPcodelist po = haDrugPcodelistMapper.selectMinPreview(today);

        //打印出po,居然一直查询为空？
        System.out.println(po);
        if (po == null) {
            // 2. 无空号 → 插入新行（当天最大号 +1）
            int maxNum = haDrugPcodelistMapper.getTodayMaxNum(today); //当前已经使用的最大号
            int nextNum = maxNum + 1;
            HaDrugPcodelist newPo = new HaDrugPcodelist();
            newPo.setCurDate(today);
            newPo.setCurNum(nextNum);   // 从 1 开始
            newPo.setStatus("PREVIEW");
            haDrugPcodelistMapper.insertNewRow(newPo);   // 插入新行，seqid 回填
            po = newPo;
        }
        // 3. 立即占住
        haDrugPcodelistMapper.markLocked(po.getSeqid().longValue()); //是否需要增加一个lock的状态
        return po.buildNo();   // 返回新行
    }

    @Override
    @Transactional
    public HaDrugPcodelist nextMinPurchaseNoObj() {   //返回对象版本的
        // Date today = new Date();  //时间的格式都不对，
        java.time.LocalDate today = java.time.LocalDate.now(); //需要将日期的格式换为这个
        System.out.println(today);
        // 1. 查最小空号
        HaDrugPcodelist po = haDrugPcodelistMapper.selectMinPreview(today);

        //打印出po,居然一直查询为空？
        System.out.println(po);
        if (po == null) {
            // 2. 无空号 → 插入新行（当天最大号 +1）
            int maxNum = haDrugPcodelistMapper.getTodayMaxNum(today); //当前已经使用的最大号
            int nextNum = maxNum + 1;
            HaDrugPcodelist newPo = new HaDrugPcodelist();
            newPo.setCurDate(today);
            newPo.setCurNum(nextNum);   // 从 1 开始
            newPo.setStatus("PREVIEW");
            haDrugPcodelistMapper.insertNewRow(newPo);   // 插入新行，seqid 回填
            po = newPo;
        }
        // 3. 立即占住
        haDrugPcodelistMapper.markLocked(po.getSeqid().longValue()); //是否需要增加一个lock的状态
        return po;   // 返回新行
    }

    //根据id 来哦释放状态@鲍小伟20251201
    public int sfMinPurchaseNo(Long seqid)
    {
        return haDrugPcodelistMapper.sfMinPurchaseNo(seqid);
    }

    //根据id 来释放使用的状态@鲍小伟20251203
    public int useMinPurchaseNo(Long seqid)
    {
        return haDrugPcodelistMapper.markUsed(seqid);
    }



}
